package main

import "fmt"

func test(x int64) {
	fmt.Printf("x=%v, %[1]T\n", x)
}

func main() {
	// a, b, c := 100, 200, "300"
	// fmt.Println(a, b, c)
	// // 经典做法
	// t := a
	// a = b
	// b = t
	// fmt.Println(a, b)
	// a, b = b, a
	// fmt.Println(a, b)
	// var s = 1
	// var x = 2.1
	// fmt.Println(s, x)
	// fmt.Printf("%T,%[1]v,%T,%[2]v\n", s, x)
	// // fmt.Println(s + x) // 不可以，类型不匹配
	// fmt.Println(1 + 2.1) // 用了 untyped constant 编译器会自动转换类型 隐式类型转换
	// fmt.Println(s + int(x))
	// fmt.Printf("%T %[1]v\n", 1+2.1) // 隐式，类型转换 等价于"%[1]T %[2]v\n"
	// test(100)
	// var y = 100 //int
	// test(int64(y))

	// var a int64 = 100 // 左边 a 为 int64 类型，右边 100 无类型字面常量缺省类型为 int
	// fmt.Printf("%T %[1]d\n", a)

	var t = 'a'                                                // rune 类型，等价于 int32 4bytes 97 0x61
	fmt.Printf("%T %[1]c %[1]q %[1]d %[1]x %#[1]b %[1]v\n", t) // rune 是 int32 的别名，rune 是一个字符类型，int32 是一个整数类型
	fmt.Printf("%T %[1]s %[1]q %[1]v", "a")                    // string 类型，等价于 []byte 1bytes 97 0x61

	var f = 123493.14159261242354589
	fmt.Printf("%v %[1]e %3.2[1]f %%\n", f)       // %g %f %e Print* => console stdout
	d := fmt.Sprintf("%v %[1]e %3.2[1]f %%\n", f) // %g %f %e Sprint* 返回一个字符串
	fmt.Printf("%T %[1]q\n", d)

	d = fmt.Sprintln("abc\nmn")
	fmt.Printf("%T %[1]q", d)

}
